883115
@@ -29,6 +29,8 @@
import java.lang.instrument.ClassFileTransformer;
 import java.security.ProtectionDomain;
 import java.util.HashSet;
 import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 import org.jboss.logging.BasicLogger;
 import org.jboss.logging.Logger;
@@ -50,6 +52,7 @@
import org.wildfly.security.manager.WildFlySecurityManager;
 public class Hibernate51CompatibilityTransformer implements ClassFileTransformer {
 
     private static final Hibernate51CompatibilityTransformer instance = new Hibernate51CompatibilityTransformer();
+    // TODO: replace useASMExperimental and use of Opcodes.ASM7_EXPERIMENTAL with Opcodes.ASM7 when ASM JDK 11 support is available.
     private static final File showTransformedClassFolder;
     public static final BasicLogger logger = Logger.getLogger("org.jboss.as.hibernate.transformer");
 
@@ -62,6 +65,8 @@
public class Hibernate51CompatibilityTransformer implements ClassFileTransformer
         }
     }
 
+    private static final boolean useASMExperimental = getMajorJavaVersion() >= 11;
+
     private static final String markerAlreadyTransformed = "$_org_jboss_as_hibernate_Hibernate51CompatibilityTransformer_transformed_$";
 
     public static Hibernate51CompatibilityTransformer getInstance() {
@@ -90,7 +95,7 @@
public class Hibernate51CompatibilityTransformer implements ClassFileTransformer
 
         }
         try {
-            classReader.accept(new ClassVisitor(Opcodes.ASM6, traceClassVisitor) {
+            classReader.accept(new ClassVisitor(useASMExperimental ? Opcodes.ASM7_EXPERIMENTAL : Opcodes.ASM6, traceClassVisitor) {
 
                 // clear transformed state at start of each class visit
                 @Override
@@ -362,7 +367,7 @@
public class Hibernate51CompatibilityTransformer implements ClassFileTransformer
 
         try (InputStream is = classLoader.getResourceAsStream(className.replace('.', '/') + ".class")) {
             ClassReader classReader = new ClassReader(is);
-            classReader.accept(new ClassVisitor(Opcodes.ASM6) {
+            classReader.accept(new ClassVisitor(useASMExperimental ? Opcodes.ASM7_EXPERIMENTAL : Opcodes.ASM6) {
 
                 @Override
                 public void visit(int version, int access, String name, String signature,
@@ -391,5 +396,15 @@
public class Hibernate51CompatibilityTransformer implements ClassFileTransformer
         }
     }
 
-}
+    private static int getMajorJavaVersion() {
+        int major = 8;
+        String version = WildFlySecurityManager.getPropertyPrivileged("java.specification.version", null);
+        if (version != null) {
+            Matcher matcher = Pattern.compile("^(?:1\\.)?(\\d+)$").matcher(version);
+            if (matcher.find()) {
+                major = Integer.valueOf(matcher.group(1));
+            }
+        }
+        return major;
+    }}
 
